﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AddUseMVVM.ViewModel
{
    /// <summary>
    /// 具有通知能力的对象，也就是View和ViewModel之间的双向的桥梁，DataBindling
    /// ViewModel需要将自己的变化通过双向的数据绑定Binging通知给View，将变动的新数据传输到View上去
    /// NotificationObject就是咱们所有ViewModel的基类
    /// </summary>
    internal class NotificationObject : INotifyPropertyChanged
    {
        /// <summary>
        /// 如果某一个对象借助双向的DataBlinding关联到或者叫绑定到UI界面上的某一个元素上，当对象的值变化的时候，这个DataBlinding就是在侦听PropertyChanged有没有发生，如果PropertyChanged发生率，那么DataBlinding就把变化后的值送到界面上去
        /// </summary>
        public event PropertyChangedEventHandler? PropertyChanged;

        /// <summary>
        /// 为了简单起见，对PropertyChanged事件进行一个简单的封装
        /// </summary>
        /// <param name="propertyName"> 对象中的属性名字，一定要保证这个RaisePropertyChanged方法传进来的参数跟被监听的对象中的属性是保持一致的，一模一样的 </param>
        public void RaisePropertyChanged(string propertyName)
        {
            if(this.PropertyChanged != null)
            {
                //表示【告诉属性】是UI上的哪个值发生变化了：PropertyChangedEventArgs(propertyName)，就是UI上叫propertyName这个值发生了变化，所以赶紧去更新对应对象中的属性
                this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
